package thread;

/**
 * @User: vitobo
 * @Date: 2024-08-01
 * @Description: 懒汉模式 (需要时 才创建)
 *
 * 这个实例并不是 类加载的时候创建了; 而是真正第一次使用的时候,才去创建; (如果不用,就不创建了)
 *
 *  懒汉模式: 多线程调用, 不是线程安全的;
 *
 */

// 懒汉模式 线程安全改进版 多线程安全
class SingletonLazy{
    // volatile 关键字两个功能:
    //  1.解决内存可见性
    //  2.禁止指令重排序
    // 确保了在多线程环境中对instance的正确初始化，并且避免了由于JVM指令重排序可能带来的问题
    private volatile static SingletonLazy instance = null;

    // 如果对象还没有创建,才加锁
    // 如果对象已经创建过了, 就不加锁了;
    public static SingletonLazy getInstance() {
        // 是否要加锁
        if (instance == null) {
            // 满足特定条件之后, 才真正加锁;
            synchronized (SingletonLazy.class){
                // 是否要创建对象
                if(instance == null){
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() {}
}

/*
// 线程安全的 懒汉模式
class SingletonLazy{
    private static SingletonLazy instance = null;

    //
    public static synchronized SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy() {}
}

*/


/*

// 线程不安全
class SingletonLazy{
    private volatile static SingletonLazy instance = null;

    //
    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy() {}
}
*/

public class ThreadDemo20 {
    public static void main(String[] args) {
        // 第一次调用 为空null 创建一个实例
        SingletonLazy s = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();

        // 同一个实例
        System.out.println(s == s2);

    }
}
